import * as THREE from "three"
// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from "three/addons/controls/OrbitControls.js"
//引入性能监视器stats.js
import Stats from "three/addons/libs/stats.module.js"
// 创建3D场景对象Scene
const scene = new THREE.Scene()
//创建一个长方体几何对象Geometry
const geometry = new THREE.SphereGeometry(100, 100, 100)
//创建一个材质对象Material
const material = new THREE.MeshLambertMaterial({
  color: "blue", //设置材质颜色
  transparent: true, //开启透明
  opacity: 0.5, //设置透明度
  side: THREE.DoubleSide,
  shininess: 20, //高光部分的亮度，默认30
  specular: 0x444444, //高光部分的颜色
})
//点光源：两个参数分别表示光源颜色和光照强度
// 参数1：0xffffff是纯白光,表示光源颜色
// 参数2：1.0,表示光照强度，可以根据需要调整
const pointLight = new THREE.PointLight(0xffffff, 1.0)
//点光源位置
pointLight.position.set(400, 0, 0) //点光源放在x轴上
scene.add(pointLight) //点光源添加到场景中
// 创建网格模型 两个参数分别为几何体geometry、材质material
const mesh = new THREE.Mesh(geometry, material) //网格模型对象Mesh
//设置网格模型在三维空间中的位置坐标，默认是坐标原点
mesh.position.set(0, 0, 0)
//将网格模型添加到场景中
scene.add(mesh)
// 实例化一个透视投影相机对象
// 定义相机输出画布的尺寸(单位:像素px)
const width = window.innerWidth //窗口文档显示区的宽度作为画布宽度
const height = window.innerHeight //窗口文档显示区的高度作为画布高度
// 30:视场角度, width / height:Canvas画布宽高比, 1:近裁截面, 3000：远裁截面
const camera = new THREE.PerspectiveCamera(3000, width / height, 1, 3000)
//相机在Three.js三维坐标系中的位置
// 根据需要设置相机位置具体值
camera.position.set(200, 200, 200)
//相机观察目标指向Threejs 3D空间中某个位置
camera.lookAt(0, 0, 0) //坐标原点
camera.lookAt(0, 10, 0) //y轴上位置10
camera.lookAt(mesh.position) //指向mesh对应的位置
// 相机位置xyz坐标：0,10,0
mesh.position.set(0, 10, 0)
// 相机位置xyz坐标：200, 200, 200
camera.position.set(200, 200, 200)
// 创建渲染器对象
const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(width, height) //设置three.js渲染区域的尺寸(像素px)
// AxesHelper：辅助观察的坐标系
// const axesHelper = new THREE.AxesHelper(100)
// scene.add(axesHelper)
renderer.render(scene, camera) //执行渲染操作
// // 设置相机控件轨道控制器OrbitControls
const controls = new OrbitControls(camera, renderer.domElement)
// 如果OrbitControls改变了相机参数，重新调用渲染器渲染三维场景
controls.addEventListener("change", function () {
  renderer.render(scene, camera) //执行渲染操作
  // 浏览器控制台查看相机位置变化
}) //监听鼠标、键盘事件

document.body.appendChild(renderer.domElement)
document.getElementById("webgl").appendChild(renderer.domElement)

//创建stats对象
const stats = new Stats()
//stats.domElement:web页面上输出计算结果,一个div元素，
document.body.appendChild(stats.domElement)
// 渲染函数
function render() {
  //requestAnimationFrame循环调用的函数中调用方法update(),来刷新时间

  // 相机
  const x = (Math.random() - 0.5) * 200
  const y = (Math.random() - 0.5) * 200
  const z = (Math.random() - 0.5) * 200
  camera.position.set(x, y, z)
  renderer.render(scene, camera) //执行渲染操作
  requestAnimationFrame(render) //请求再次执行渲染函数render，渲染下一帧
}

stats.update()
// stats.domElement显示：渲染帧率  刷新频率,一秒渲染次数
stats.setMode(0) //默认模式
//stats.domElement显示：渲染周期 渲染一帧多长时间(单位：毫秒ms)
stats.setMode(1)
